package com.maben.config;

import cn.dev33.satoken.stp.StpUtil;
import com.maben.util.MyResponseUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * mvc配置
 * 注：
 *  public class WebMvcConfig extends WebMvcConfigurationSupport
 *  WebMvcConfigurationSupport 是一个 高级配置类，继承它会 禁用 Spring Boot 的 MVC 自动配置，包括：
 *      默认的静态资源映射（如 classpath:/static/）。
 *      默认的视图解析器。
 *      消息转换器等其他自动配置。
 *  改为实现 WebMvcConfigurer（推荐）
 *      不要继承 WebMvcConfigurationSupport，
 *      而是实现 WebMvcConfigurer 接口，这样可以在保留 Spring Boot 自动配置的同时添加自定义配置
 **/
@Configuration
@Slf4j
public class WebMvcConfig implements WebMvcConfigurer {


    /**
     * 将 [/]指向[/user/go2index]
     */
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/").setViewName("forward:/user/go2index");
    }


    /**
     * 配置saToken的拦截器，不然会报错：没有上下文
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 校验token
        registry.addInterceptor(new HandlerInterceptor() {
            @Override
            public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
                log.info("===请求路径：{}", request.getRequestURI());
                final boolean login = StpUtil.isLogin();
                log.info("===登录状态：{}", login);
                if (!login) {
                    MyResponseUtil.handleNotLoginException(request, response);
                }
                return login;
            }
        })
                .addPathPatterns("/**")
                .excludePathPatterns(
                        "/.well-known/**", "/error", //浏览器自动发起的调试探测请求，属于正常现象，直接过滤掉
                        "/",
                        "/static/**",
                        "/user/**"
                ).order(Integer.MIN_VALUE);

    }

    /**
     * 添加资源映射规则
     */
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        //静态资源映射(因为加上token验证，所以添加固定前缀放行)
        registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
        //添加knife4j
        registry.addResourceHandler("/swagger-ui.html", "/doc.html")
                .addResourceLocations("classpath:/META-INF/resources/");
        registry.addResourceHandler("/webjars/**")
                .addResourceLocations("classpath:/META-INF/resources/webjars/");
    }

}